////////////////////////////////////////////////////////////////////////////////
///                       File Name: system_call_ls.c                        ///
///                          Author: Huaxiao Liang                           ///
///                         Mail: hxliang666@qq.com                          ///
///                         04/16/2025-Wed-15:08:01                          ///
////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main( int argc, char* argv[] ) {
   // 构建参数数组：第一个参数必须是"ls"
   char** args = (char**)malloc( ( (unsigned int)argc + 1 ) * sizeof( char* ) );
   if( !args ) {
      perror( "内存分配失败" );
      return EXIT_FAILURE;
   }

   args[0] = "ls";   // 第一个参数固定为ls命令
   for( int i = 1; i < argc; i++ ) {
      args[i] = argv[i];   // 传递所有用户输入参数
   }
   args[argc] = NULL;   // 参数列表必须以NULL结尾

   // 创建子进程执行命令
   pid_t pid = fork();
   if( pid == -1 ) {
      perror( "进程创建失败" );
      free( (void*)args );
      return EXIT_FAILURE;
   }

   if( pid == 0 ) {   // 子进程
      execvp( "ls", args );
      // 如果执行到这里说明execvp失败
      perror( "命令执行失败" );
      free( (void*)args );
      exit( EXIT_FAILURE );
   } else {           // 父进程
      wait( NULL );   // 等待子进程结束
      free( (void*)args );
   }

   return EXIT_SUCCESS;
}
